package cn.com.jenson.common;

import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * BasicBo <br>
 * 用于继承
 *
 * @param <V>  Vo
 * @param <B>  Bo
 * @param <SB> SearchBo
 */
public interface BasicController<V, B, SB> {
    /**
     * 获取分页数据
     *
     * @param sb 分页条件
     * @return 分页数据
     */
    @PostMapping("/page_all")
    Result<Page<V>> pageAll(SB sb);

    /**
     * 获取数据
     *
     * @param sb 条件
     * @return 数据
     */
    @PostMapping("/list_all")
    Result<List<V>> listAll(SB sb);

    /**
     * 获取数据
     *
     * @param sb 条件
     * @return 数据
     */
    @PostMapping("/get")
    Result<V> get(SB sb) throws InstantiationException, IllegalAccessException;

    /**
     * 新增 / 修改 数据
     *
     * @param b 要新增/修改的数据
     * @return 新增/修改后的数据
     */
    @PostMapping("/edit")
    Result<V> edit(B b) throws InstantiationException, IllegalAccessException;

    /**
     * 新增 / 修改 数据
     *
     * @param bList 要新增/修改的数据集合
     * @return 新增/修改后的数据集合
     */
    @PostMapping("/edit_all")
    Result<List<V>> editAll(List<B> bList);

    /**
     * 删除数据
     *
     * @param sb 删除条件
     * @return 删除结果
     */
    @PostMapping("/deleted")
    Result<V> deleted(SB sb) throws InstantiationException, IllegalAccessException;

    /**
     * 删除数据
     *
     * @param sbList 删除 条件集合
     * @return 删除结果集合
     */
    @PostMapping("/deleted_all")
    Result<List<V>> deletedAll(List<SB> sbList) throws InstantiationException, IllegalAccessException;


    /**
     * 获取导入模板 配置
     *
     * @return 导入模板 配置
     */
    @PostMapping("/import_template_verifiers")
    List<ImportVerifierVo> importTemplateVerifiers();

    /**
     *  导入模板
     * @param userBos 导入模板 配置
     * @return 导入模板 配置
     */
//    @Deprecated
//    @PostMapping("/import_from_template")
//    Result<List<UserVo>> importFromTemplate(@RequestBody List<UserBo> userBos);


    /**
     * 导入模板下载
     *
     * @param response response
     * @throws IOException IOException
     */
    @GetMapping("/import_template_download")
    void importTemplateDownload(HttpServletResponse response) throws IOException;

    /**
     * 获取筛选项
     *
     * @return 筛选项
     */
    @GetMapping("/option")
    Result<List<SelectVo<String, Integer, V>>> option();

}
